/*
 *  Copyright 2008 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.apache.ibatis.ibator.api;

import java.util.List;
import java.util.Properties;

import org.apache.ibatis.ibator.api.dom.java.Field;
import org.apache.ibatis.ibator.api.dom.java.Interface;
import org.apache.ibatis.ibator.api.dom.java.Method;
import org.apache.ibatis.ibator.api.dom.java.TopLevelClass;
import org.apache.ibatis.ibator.api.dom.xml.Document;
import org.apache.ibatis.ibator.api.dom.xml.XmlElement;
import org.apache.ibatis.ibator.config.IbatorContext;

/**
 * This interface defines methods that will be called by ibator at different times during the code generation process.
 * These methods can be used to extend or modify the code generated by ibator. Clients may implement this interface in
 * its entirety, or extend the IbatorPluginAdapter (highly recomended).
 * <p>
 * Plugins have a lifecycle. In general, the lifecycle is this:
 * 
 * <ol>
 * <li>The setXXX methods are called one time</li>
 * <li>The validate method is called one time</li>
 * <li>The initialized method is called for each introspected table</li>
 * <li>The daoXXX methods are called for each introspected table</li>
 * <li>The modelXXX methods are called for each introspected table</li>
 * <li>The sqlMapXXX methods are called for each introspected table</li>
 * <li>The contextGenerateAdditionalJavaFiles(IntrospectedTable) method is called for each introspected table</li>
 * <li>The contextGenerateAdditionalXmlFiles(IntrospectedTable) method is called for each introspected table</li>
 * <li>The contextGenerateAdditionalJavaFiles() method is called one time</li>
 * <li>The contextGenerateAdditionalXmlFiles() method is called one time</li>
 * </ol>
 * 
 * Plugins are related to ibator contexts - so each context will have its own set of plugins. If the same plugin is
 * specified in multple contexts, then each context will hold a unique instance of the plugin.
 * <p>
 * Plugins are called, and initialized, in the same order they are specified in the configuration.
 * <p>
 * The daoXXX, modelXXX, and sqlMapXXX methods are called by the code generators supplied with ibator. If you replace
 * ibator's default code generators with other implementations, these methods may not be called.
 * 
 * @author Jeff Butler
 * @see IbatorPluginAdapter
 * 
 */
public interface IbatorPlugin
{
    public enum ModelClassType
    {
        PRIMARY_KEY, BASE_RECORD, RECORD_WITH_BLOBS
    }
    
    /**
     * Set the context under which this plugin is running
     * 
     * @param ibatorContext
     */
    void setIbatorContext(IbatorContext ibatorContext);
    
    /**
     * Set properties from the plugin configuration
     * 
     * @param properties
     */
    void setProperties(Properties properties);
    
    /**
     * This method is called just before the getGeneratedXXXFiles methods are called on the introspected table. Plugins
     * can implement this method to override any of the default attributes, or change the results of database
     * introspection, before any code generation activities occur. Attributes are listed as static Strings with the
     * prefix ATTR_ in IntrospectedTable.
     * <p>
     * A good example of overriding an attribute would be the case where a user wanted to change the name of one of the
     * generated classes, change the target package, or change the name of the generated SQL map file.
     * <p>
     * <b>Warning:</b> Anything that is listed as an attribute should not be changed by one of the other plugin methods.
     * For example, if you want to change the name of a generated example class, you should not simply change the Type
     * in the <code>modelExampleClassGenerated()</code> method. If you do, the change will not be reflected in other
     * generated artifacts.
     * 
     * @param introspectedTable
     */
    void initialized(IntrospectedTable introspectedTable);
    
    /**
     * This method is called after all the setXXX methods are called, but before any other method is called. This allows
     * the plugin to determine whether it can run or not. For example, if the plugin requires certain properties to be
     * set, and the properties are not set, then the plugin is invalid and will not run.
     * 
     * @param warnings add strings to this list to specify warnings. For example, if the plugin is invalid, you should
     *            specify why. Warnings are reported to users after the completion of the ibator run.
     * @return true if the plugin is in a valid state. Invalid plugins will not be called
     */
    boolean validate(List<String> warnings);
    
    /**
     * This method can be used to generate any additional Java file needed by your implementation. This method is called
     * once, after all other Java files have been generated.
     * 
     * @return a List of GeneratedJavaFiles - ibator will persist these files with the other files from this run of
     *         ibator.
     */
    List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles();
    
    /**
     * This method can be used to generate additional Java files needed by your implementation that might be related to
     * a specific table. This method is called once for every table in the configuration.
     * 
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return a List of GeneratedJavaFiles - ibator will persist these files with the other files from this run of
     *         ibator.
     */
    List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles(IntrospectedTable introspectedTable);
    
    /**
     * This method can be used to generate any additional XML file needed by your implementation. This method is called
     * once, after all other XML files have been generated.
     * 
     * @return a List of GeneratedXmlFiles - ibator will persist these files with the other files from this run of
     *         ibator.
     */
    List<GeneratedXmlFile> contextGenerateAdditionalXmlFiles();
    
    /**
     * This method can be used to generate additional XML files needed by your implementation that might be related to a
     * specific table. This method is called once for every table in the configuration.
     * 
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return a List of GeneratedXmlFiles - ibator will persist these files with the other files from this run of
     *         ibator.
     */
    List<GeneratedXmlFile> contextGenerateAdditionalXmlFiles(IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the entire DAO interface has been generated. Implement this method to add additional
     * methods or fields to a generated DAO interface.
     * 
     * @param interfaze the generated interface
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the interface should be generated, false if the generated interface should be ignored. In the
     *         case of multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoInterfaceGenerated(Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the entire DAO implementation has been generated. Implement this method to add
     * additional methods or fields to a generated DAO implementation.
     * 
     * @param topLevelClass the generated implementation class
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the implementation class should be generated, false if the generated implementation class should
     *         be ignored. In the case of multiple plugins, the first plugin returning false will disable the calling of
     *         further plugins.
     */
    boolean daoImplementationGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the countByExample method has been generated in the DAO implementation class.
     * 
     * @param method the generated countByExample method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoCountByExampleMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the deleteByExample method has been generated in the DAO implementation class.
     * 
     * @param method the generated deleteByExample method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoDeleteByExampleMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the deleteByPrimaryKey method has been generated in the DAO implementation class.
     * 
     * @param method the generated deleteByPrimaryKey method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoDeleteByPrimaryKeyMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the insert method has been generated in the DAO implementation class.
     * 
     * @param method the generated insert method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoInsertMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the insert selective method has been generated in the DAO implementation class.
     * 
     * @param method the generated insert method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoInsertSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the selectByExampleWithBLOBs method has been generated in the DAO implementation
     * class.
     * 
     * @param method the generated selectByExampleWithBLOBs method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoSelectByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the selectByExampleWithoutBLOBs method has been generated in the DAO implementation
     * class.
     * 
     * @param method the generated selectByExampleWithoutBLOBs method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoSelectByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the selectByPrimaryKey method has been generated in the DAO implementation class.
     * 
     * @param method the generated selectByPrimaryKey method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoSelectByPrimaryKeyMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByExampleSelective method has been generated in the DAO implementation
     * class.
     * 
     * @param method the generated updateByExampleSelective method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByExampleSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByExampleWithBLOBs method has been generated in the DAO implementation
     * class.
     * 
     * @param method the generated updateByExampleWithBLOBs method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByExampleWithoutBLOBs method has been generated in the DAO implementation
     * class.
     * 
     * @param method the generated updateByExampleWithoutBLOBs method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByPrimaryKeySelective method has been generated in the DAO implementation
     * class.
     * 
     * @param method the generated updateByPrimaryKeySelective method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByPrimaryKeySelectiveMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByPrimaryKeyWithBLOBs method has been generated in the DAO implementation
     * class.
     * 
     * @param method the generated updateByPrimaryKeyWithBLOBs method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByPrimaryKeyWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByPrimaryKeyWithoutBLOBs method has been generated in the DAO implementation
     * class.
     * 
     * @param method the generated updateByPrimaryKeyWithBLOBs method
     * @param topLevelClass the partially implemented DAO implementation class. You can add additional imported classes
     *            to the implementation class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the countByExample method has been generated in the DAO interface class.
     * 
     * @param method the generated countByExample method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoCountByExampleMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the deleteByExample method has been generated in the DAO interface class.
     * 
     * @param method the generated deleteByExample method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoDeleteByExampleMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the deleteByPrimaryKey method has been generated in the DAO interface class.
     * 
     * @param method the generated deleteByPrimaryKey method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoDeleteByPrimaryKeyMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the insert method has been generated in the DAO interface class.
     * 
     * @param method the generated insert method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoInsertMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the insert selective method has been generated in the DAO interface class.
     * 
     * @param method the generated insert method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoInsertSelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the selectByExampleWithBLOBs method has been generated in the DAO interface class.
     * 
     * @param method the generated selectByExampleWithBLOBs method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoSelectByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the selectByExampleWithoutBLOBs method has been generated in the DAO interface class.
     * 
     * @param method the generated selectByExampleWithoutBLOBs method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoSelectByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the selectByPrimaryKey method has been generated in the DAO interface class.
     * 
     * @param method the generated selectByPrimaryKey method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoSelectByPrimaryKeyMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByExampleSelective method has been generated in the DAO interface class.
     * 
     * @param method the generated updateByExampleSelective method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByExampleSelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByExampleWithBLOBs method has been generated in the DAO interface class.
     * 
     * @param method the generated updateByExampleWithBLOBs method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByExampleWithoutBLOBs method has been generated in the DAO interface class.
     * 
     * @param method the generated updateByExampleWithoutBLOBs method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByPrimaryKeySelective method has been generated in the DAO interface class.
     * 
     * @param method the generated updateByPrimaryKeySelective method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByPrimaryKeySelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByPrimaryKeyWithBLOBs method has been generated in the DAO interface class.
     * 
     * @param method the generated updateByPrimaryKeyWithBLOBs method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByPrimaryKeyWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByPrimaryKeyWithoutBLOBs method has been generated in the DAO interface
     * class.
     * 
     * @param method the generated updateByPrimaryKeyWithoutBLOBs method
     * @param interfaze the partially implemented DAO interface class. You can add additional imported classes to the
     *            interface class if necessary.
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean daoUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);
    
    /**
     * This method is called after the field is generated for a specific column in a table.
     * 
     * @param field the field generated for the specified column
     * @param topLevelClass the partially implemented model class. You can add additional imported classes to the
     *            implementation class if necessary.
     * @param introspectedColumn ibator's class containing information about the column related to this field as
     *            introspected from the database
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @param modelClassType the type of class that the field is generated for
     * @return true if the field should be generated, false if the generated field should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType);
    
    /**
     * This method is called after the getter, or accessor, method is generated for a specific column in a table.
     * 
     * @param method the getter, or accessor, method generated for the specified column
     * @param topLevelClass the partially implemented model class. You can add additional imported classes to the
     *            implementation class if necessary.
     * @param introspectedColumn ibator's class containing information about the column related to this field as
     *            introspected from the database
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @param modelClassType the type of class that the field is generated for
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType);
    
    /**
     * This method is called after the setter, or mutator, method is generated for a specific column in a table.
     * 
     * @param method the setter, or mutator, method generated for the specified column
     * @param topLevelClass the partially implemented model class. You can add additional imported classes to the
     *            implementation class if necessary.
     * @param introspectedColumn ibator's class containing information about the column related to this field as
     *            introspected from the database
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @param modelClassType the type of class that the field is generated for
     * @return true if the method should be generated, false if the generated method should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType);
    
    /**
     * This method is called after the primary key class is generated by the ibator supplied JavaModelGenerator. This
     * method will only be called if the table rules call for generation of a primary key class.
     * <p/>
     * This method is only guaranteed to be called by the ibator supplied Java model generators. Other user supplied
     * generators may, or may not, call this method.
     * 
     * @param topLevelClass the generated primary key class
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the class should be generated, false if the generated class should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean modelPrimaryKeyClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called after the base record class is generated by the ibator supplied JavaModelGenerator. This
     * method will only be called if the table rules call for generation of a base record class.
     * <p/>
     * This method is only guaranteed to be called by the ibator supplied Java model generators. Other user supplied
     * generators may, or may not, call this method.
     * 
     * @param topLevelClass the generated base record class
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the class should be generated, false if the generated class should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called after the record with BLOBs class is generated by the ibator supplied JavaModelGenerator.
     * This method will only be called if the table rules call for generation of a record with BLOBs class.
     * <p/>
     * This method is only guaranteed to be called by the ibator supplied Java model generators. Other user supplied
     * generators may, or may not, call this method.
     * 
     * @param topLevelClass the generated record with BLOBs class
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the class should be generated, false if the generated class should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called after the example class is generated by the ibator supplied JavaModelGenerator. This method
     * will only be called if the table rules call for generation of an example class.
     * <p/>
     * This method is only guaranteed to be called by the ibator supplied Java model generators. Other user supplied
     * generators may, or may not, call this method.
     * 
     * @param topLevelClass the generated example class
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the class should be generated, false if the generated class should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the SqlMap file has been generated.
     * 
     * @param sqlMap the generated file (containing the file name, package name, and project name)
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the sqlMap should be generated, false if the generated sqlMap should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the SqlMap document has been generated. This method can be used to add additional XML
     * elements the the generated document.
     * 
     * @param document the generated document (note that this is ibator's internal Document class - not the w3c XML
     *            Document class)
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the document should be generated, false if the generated document should be ignored. In the case
     *         of multiple plugins, the first plugin returning false will disable the calling of further plugins. Also,
     *         if any plugin returns false, then the <tt>sqlMapGenerated</tt> method will not be called.
     */
    boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the base resultMap is generated.
     * 
     * @param element the generated &lt;resultMap&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapResultMapWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the countByExample element is generated.
     * 
     * @param element the generated &lt;select&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapCountByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the deleteByExample element is generated.
     * 
     * @param element the generated &lt;delete&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapDeleteByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the deleteByPrimaryKey element is generated.
     * 
     * @param element the generated &lt;delete&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapDeleteByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the exampleWhereClause element is generated.
     * 
     * @param element the generated &lt;sql&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapExampleWhereClauseElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the insert element is generated.
     * 
     * @param element the generated &lt;insert&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapInsertElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the insert selective element is generated.
     * 
     * @param element the generated &lt;insert&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapInsertSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the resultMap with BLOBs element is generated - this resultMap will extend the base
     * resultMap.
     * 
     * @param element the generated &lt;resultMap&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapResultMapWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the selectByPrimaryKey element is generated.
     * 
     * @param element the generated &lt;select&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapSelectByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the selectByExample element is generated.
     * 
     * @param element the generated &lt;select&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the selectByExampleWithBLOBs element is generated.
     * 
     * @param element the generated &lt;select&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByExampleSelective element is generated.
     * 
     * @param element the generated &lt;update&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapUpdateByExampleSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByExampleWithBLOBs element is generated.
     * 
     * @param element the generated &lt;update&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapUpdateByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByExampleWithourBLOBs element is generated.
     * 
     * @param element the generated &lt;update&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapUpdateByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByPrimaryKeySelective element is generated.
     * 
     * @param element the generated &lt;update&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapUpdateByPrimaryKeySelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByPrimaryKeyWithBLOBs element is generated.
     * 
     * @param element the generated &lt;update&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
    
    /**
     * This method is called when the updateByPrimaryKeyWithoutBLOBs element is generated.
     * 
     * @param element the generated &lt;update&gt; element
     * @param introspectedTable ibator's class containing information about the table as introspected from the database
     * @return true if the element should be generated, false if the generated element should be ignored. In the case of
     *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
     */
    boolean sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);
}
